package com.yangdm.util;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;

/**
 * @program: oracle2mysqltool
 * @description: 文件写入工具类
 * @author: yangdm
 * @create: 2024-12-25 11:21
 **/

public class FileUtils {

    /**
     * 将字符串内容写入文件，如果文件已存在则覆盖。
     *
     * @param filePath 文件路径
     * @param content  要写入的内容
     */
    public static void writeToFile(String filePath, String content) {
        try {
            Path path = Paths.get(filePath);
            // 创建目录（包括所有必要的父目录），如果目录已存在则跳过
            createDirectoryIfNotExists(path.getParent().toString());
            Files.writeString(path, content, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
        } catch (IOException e) {
            throw new RuntimeException("Failed to write to file: " + filePath, e);
        }
    }

    /**
     * 将字符串内容追加到文件末尾。
     *
     * @param filePath 文件路径
     * @param content  要追加的内容
     */
    public static void appendToFile(String filePath, String content) {
        try {
            Path path = Paths.get(filePath);
            // 创建目录（包括所有必要的父目录），如果目录已存在则跳过
            createDirectoryIfNotExists(path.getParent().toString());
            Files.writeString(path, content, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
        } catch (IOException e) {
            throw new RuntimeException("Failed to append to file: " + filePath, e);
        }
    }

    /**
     * 将字符串列表写入文件，每个元素占一行，如果文件已存在则覆盖。
     *
     * @param filePath 文件路径
     * @param lines    要写入的行列表
     */
    public static void writeLinesToFile(String filePath, List<String> lines) {
        try {
            Path path = Paths.get(filePath);
            Files.write(path, lines, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
        } catch (IOException e) {
            throw new RuntimeException("Failed to write lines to file: " + filePath, e);
        }
    }

    /**
     * 将字节数组写入文件，如果文件已存在则覆盖。
     *
     * @param filePath 文件路径
     * @param bytes    要写入的字节数组
     */
    public static void writeBytesToFile(String filePath, byte[] bytes) {
        try {
            Path path = Paths.get(filePath);
            Files.write(path, bytes, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
        } catch (IOException e) {
            throw new RuntimeException("Failed to write bytes to file: " + filePath, e);
        }
    }

    /**
     * 检查文件是否存在。
     *
     * @param filePath 文件路径
     * @return 如果文件存在返回true，否则返回false
     */
    public static boolean fileExists(String filePath) {
        Path path = Paths.get(filePath);
        return Files.exists(path);
    }

    /**
     * 创建目录（包括所有必要的父目录），如果目录已存在则跳过。
     *
     * @param directoryPath 目录路径
     */
    public static void createDirectoryIfNotExists(String directoryPath) {
        try {
            Path path = Paths.get(directoryPath);
            if (!Files.exists(path)) {
                Files.createDirectories(path);
                System.out.println("Directory created: " + directoryPath);
            } else {
                System.out.println("Directory already exists: " + directoryPath);
            }
        } catch (IOException e) {
            throw new RuntimeException("Failed to create directory: " + directoryPath, e);
        }
    }

    /**
     * 按行追加写入文件。
     *
     * @param filePath 文件路径
     * @param line     要追加的一行内容
     */
    public static void appendLineToFile(String filePath, String line) {
        try {
            Path path = Paths.get(filePath);
            // 创建目录（包括所有必要的父目录），如果目录已存在则跳过
            createDirectoryIfNotExists(path.getParent().toString());
            Files.writeString(path, line + System.lineSeparator(), StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
        } catch (IOException e) {
            throw new RuntimeException("Failed to append line to file: " + filePath, e);
        }
    }

    /**
     * 按行覆盖写入文件。
     *
     * @param filePath 文件路径
     * @param line     要写入的一行内容
     */
    public static void writeLineToFile(String filePath, String line) {
        try {
            Path path = Paths.get(filePath);
            // 创建目录（包括所有必要的父目录），如果目录已存在则跳过
            createDirectoryIfNotExists(path.getParent().toString());
            Files.writeString(path, line + System.lineSeparator(), StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
        } catch (IOException e) {
            throw new RuntimeException("Failed to write line to file: " + filePath, e);
        }
    }

    /**
     * 清理文件内容，使其变为一个空文件。
     *
     * @param filePath 文件路径
     */
    public static void clearFileContent(String filePath) {
        try {
            Path path = Paths.get(filePath);
            // 如果文件不存在，则创建一个空文件
            if (!Files.exists(path)) {
                Files.createFile(path);
                System.out.println("File did not exist and has been created: " + filePath);
            } else {
                // 清空文件内容
                Files.writeString(path, "", StandardCharsets.UTF_8, StandardOpenOption.TRUNCATE_EXISTING);
                System.out.println("File content cleared: " + filePath);
            }
        } catch (IOException e) {
            throw new RuntimeException("Failed to clear content of file: " + filePath, e);
        }
    }

}
